import multiprocessing
import psutil
import os
import time


def get_memory_info():
    # 获取当前进程的 PID
    pid = os.getpid()
    # 获取当前进程的 Process 对象
    process = psutil.Process(pid)
    # 获取当前进程占用的内存信息
    memory_info = process.memory_info()
    # 获取当前进程占用的内存大小（以字节为单位）
    memory_usage = memory_info.rss/1024/1024
    # 获取系统的总内存信息
    total_memory = psutil.virtual_memory().total
    # 计算当前进程占用内存占总内存的比例
    memory_percentage = round((memory_usage / total_memory) * 100,2)
    print(f"进程 ID: {pid}, 占用内存大小: {memory_usage:.2f}M, 占总内存百分比: {memory_percentage}")
    # 模拟一些工作
    time.sleep(2)

def get_cpu_info():
    # 获取当前进程的 PID
    pid = os.getpid()
    # 获取当前进程的 Process 对象
    process = psutil.Process(pid)
    # 获取当前进程占用的 CPU 时间,
    cpu_times_start = process.cpu_times()
    # 模拟一些cpu密集型工作
    for _ in range(1000000):
        _ = 1 + 1
    # 工作结束后的 CPU 时间
    cpu_times_end = process.cpu_times()
    cpu_time_used = cpu_times_end.user + cpu_times_end.system - cpu_times_start.user - cpu_times_start.system
    # 获取当前进程占用的 CPU 时间百分比
    # nterval 参数指定了测量的时间间隔，该函数会阻塞当前线程指定的时间，以准确计算 CPU 使用率。
    cpu_percentage = process.cpu_percent(interval=1) # 获取当前进程占用的 CPU 时间百分比，interval参数指定获取 CPU 时间的间隔时间，单位为秒
    print(f"进程 ID: {pid}, 占用 CPU 时间: {cpu_time_used:.2f}, 占 CPU 时间百分比: {cpu_percentage:.4f}",sep="\n")
    # 模拟一些工作
    time.sleep(2)


if __name__ == "__main__":
    # 创建进程池，这里进程池大小设置为 CPU 核心数
    num_cpus = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=num_cpus)

    # 向进程池提交任务
    for _ in range(num_cpus):
        pool.apply_async(get_memory_info) #向进程池异步提交任务，每个进程执行get_memory_info函数
        time.sleep(1)
        print("*"*30)
        pool.apply_async(get_cpu_info)

    # 关闭进程池，不再接受新的任务
    pool.close()
    # 等待所有任务完成
    pool.join()